﻿using System;
//4.7.8 可空类型的替代方法
//在可空类型成为C#语言的一部分之前（例如C# 2.0以前版本），有很多方法可用来处理可空值类型，由于历史原因，这些方法的使用实例现在仍然存在于.NET Framework中。
//其中一个就是将一个特定的非空值指定为“空值”，使用实例就是字符串和数组类。String.IndexOf在找不到字符时会返回特殊值-1。

namespace _121_可空类型_可空类型的替代方法
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = "Pink".IndexOf('b');
            Console.WriteLine(i); //-1
            //然而，Array.IndexOf只有在索引小于0时才会返回-1，最常见的规则是IndexOf返回比数据下限小1的值。
            //在下一个例子中，IndexOf在未找到某个元素时返回0。
            //创建以下下限为1（而不是0）的数组：
            Array a = Array.CreateInstance(typeof(string), new int[] { 2 }, new int[] { 1 });
            a.SetValue("a", 1);
            a.SetValue("b", 2);
            Console.WriteLine(Array.IndexOf(a, "c")); // 0
            //以下原因决定了“魔法值”是有问题的：
            //    使用它意味着每个数值类型有不同的空值表示方式。相反，可空值只用一种通用模式来处理所有的数值类型。
            //    可能会出现指定不合理的值。在上一个例子中，可能总会使用-1。更早前表示一个未知账号余额和未知温度值的例子也采用相同的方法。
            //    不对魔法值进行测试可能会导致出现错误值，而且这个错误值会直到运行时才被发现，它会产生一个意外的值。然而，没有测试空值的HasValue会马上抛出一个InvalidOperationException异常。
            //    类型不支持获得空值。类型可以传达程序的意图，允许编译器检查其正确性，实现编译器的保持一致的规则集。

            Console.ReadKey();
        }
    }
}